// 封装购物车模块
import {defineStore} from 'pinia'
import { computed, ref } from "vue";
import { useUserStore } from '@/stores/user'
import { getCartApi, postCartApi,deleteCartApi } from '@/apis/cartApi'
export const useCartStore  = defineStore('cart',()=>{
    // 定义购物车数据
    const cartList = ref([])
    const userStore = useUserStore()
    // 使用computed获取过来的token值会随着token发生改变而更新
    const isLogin = computed(() => userStore.userInfo.token)

    // 当操作购物车后最新的购物车列表
    const newCartList =async()=>{
        const res = await getCartApi()
        cartList.value = res.result
    }

    // 添加购物车操作
    const addCart = async(goods)=>{
        // 如果token有值则请求接口数据（说明登录账号）
        if(isLogin.value){
            const { skuId, count } = goods
            await postCartApi({ skuId, count })
            newCartList()
        }else{

        // 找出当前购物车中skuId和传过来goods中的skuId相同的一项，如果两个相同则返回skuId，如果找不到则为undefind
        // find()  它用于查找数组中满足特定条件的第一个元素       item 为满足条件的值
        const item =cartList.value.find((item)=>goods.skuId === item.skuId)
        // 如果item有值则count++
        if(item){
            item.count++
        }else{
            cartList.value.push(goods)
        }
        }

        
    }
    // 删除购物车
    const delCart = async(skuId)=>{
        if(isLogin.value){
          await  deleteCartApi([skuId])
          newCartList()
        }else{
        // 删除的两种方法：
        // 1、找到要删除的下标值 - splice
        // 通过findIndex()方法拿到的是要删除数据的下标值
        // const idx = cartList.value.findIndex((item)=>skuId === item.skuId )     //取cartList中与传过来skuId相等的下标值
        // cartList.value.splice(idx,1)
        // 2、使用数据过滤的方法 - filter
        console.log(cartList.value);
        cartList.value = cartList.value.filter((item)=>skuId !== item.skuId)    //过滤出与传过来的skuId和cartList中skuId不一样的值存到新的变量里
        }
       
    }


    // 退出登录后清空购物车
    const clearCart = ()=>{
        cartList.value = []
    }
    // 计算属性
    // reduce() 累加器   a代表当前累计值    c代表当前数组元素   0可选的初始累计值
    const allCount = computed(()=>cartList.value.reduce((a,c)=> a + c.count,0))    //计算总数量
    const allPrice = computed(()=>cartList.value.reduce((a,c)=> a + c.count * c.price,0))  //计算总价格

    // 计算购物车内选中的总数量和价格
    const checkCount = computed( ()=>cartList.value.filter((item)=>item.selected).reduce((a,c)=> a + c.count,0))
    const checkPrice = computed( ()=>cartList.value.filter((item)=>item.selected).reduce((a,c)=> a + c.count* c.price,0))

    // 单选功能
    const singleCheck =(skuId,selected)=>{
        // 根据skuId筛选出与当前skuId相等的那一项并赋值给item
      const item = cartList.value.find((item)=> skuId === item.skuId)
    //   修改当前项的selected
      item.selected = selected
    }

    // 是否全选
    // every() 用于检查数组中的所有元素是否都满足指定的条件。如果所有元素都满足条件，则返回 true；否则，返回 false
    const isAll = computed(()=>cartList.value.every((item)=>item.selected ))

    // 全选功能
    const allCheck = (selected)=>{
        cartList.value.forEach(item => {
            item.selected = selected
        });
    }

    return{
        cartList,
        addCart,
        delCart,
        allCount,
        allPrice,
        clearCart,
        singleCheck,
        isAll,
        allCheck,
        checkCount,
        checkPrice,
        newCartList
    }
},{
    persist: true
})